package org.apache.lucene.demo;

import java.util.HashSet;
import java.util.Set;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.Tag;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import org.htmlparser.util.SimpleNodeIterator;

public class HtmlParserTool {

	private static String enconding = "gbk";

	// 获取一个网站上的链接,filter 用来过滤链接
	public static Set<String> extracLinks(String url, LinkFilter filter) {

		Set<String> links = new HashSet<String>();
		try {
			Parser parser = new Parser(url);
			parser.setEncoding(enconding);
			// 过滤 <frame >标签的 filter，用来提取 frame 标签里的 src 属性所表示的链接
			NodeFilter frameFilter = new NodeFilter() {
				public boolean accept(Node node) {
					if (node.getText().startsWith("frame src=")) {
						return true;
					} else {
						return false;
					}
				}
			};
			// OrFilter 来设置过滤 <a> 标签，和 <frame> 标签
			OrFilter linkFilter = new OrFilter(new NodeClassFilter(
					LinkTag.class), frameFilter);
			// 得到所有经过过滤的标签
			NodeList list = parser.extractAllNodesThatMatch(linkFilter);
			for (int i = 0; i < list.size(); i++) {
				Node tag = list.elementAt(i);
				if (tag instanceof LinkTag)// <a> 标签
				{
					LinkTag link = (LinkTag) tag;
					String linkUrl = link.getLink();// url
					if (filter.accept(linkUrl))
						links.add(linkUrl);
				} else// <frame> 标签
				{
					// 提取 frame 里 src 属性的链接如 <frame src="test.html"/>
					String frame = tag.getText();
					int start = frame.indexOf("src=");
					frame = frame.substring(start);
					int end = frame.indexOf(" ");
					if (end == -1)
						end = frame.indexOf(">");
					String frameUrl = frame.substring(5, end - 1);
					if (filter.accept(frameUrl))
						links.add(frameUrl);
				}
			}
		} catch (ParserException e) {
			e.printStackTrace();
		}
		return links;
	}

	/**
	 * 获取新闻内容
	 * 
	 * @param url
	 * @return
	 */
	public static String getNewsContent(String url) {
		return null;
	}

	/**
	 * 获取新闻标题
	 * 
	 * @param url
	 * @return
	 */
	public static String getNewsTitle(String url) {
		try {
			Parser parser = new Parser(url);
			parser.setEncoding(enconding);
			NodeList nodeList = parser
					.extractAllNodesThatMatch(new NodeFilter() {
						@Override
						public boolean accept(Node node) {
							return ((node instanceof Tag)
									&& !((Tag) node).isEndTag() && ((Tag) node)
									.getTagName().equals("TITLE"));
						}
					});
			if (nodeList != null && nodeList.size() > 0) {
				Node node = nodeList.elementAt(0);
				return node.toPlainTextString();
			}
		} catch (ParserException e) {
			e.printStackTrace();
		}
		return "";
	}

	/**
	 * 提取包含关键字的节点内容
	 * 
	 * @param url
	 * @param keyWord
	 */
	public static void extractKeyWordText(String url, String keyWord) {
		try {
			// 解析器对象,url为参数
			Parser parser = new Parser(url);
			parser.setEncoding(enconding);
			// 迭代所有节点, null 表示不使用 NodeFilter
			NodeList list = parser.parse(null);
			// 从初始的节点列表跌倒所有的节点
			processNodeList(list, keyWord);
		} catch (ParserException e) {
			e.printStackTrace();
		}
	}

	private static void processNodeList(NodeList list, String keyWord) {
		SimpleNodeIterator iterator = list.elements();
		while (iterator.hasMoreNodes()) {
			Node node = iterator.nextNode();
			// 该节点的子节点
			NodeList childList = node.getChildren();
			// 为空，说明为值节点
			if (childList == null) {
				String result = node.toPlainTextString();
				if (result.indexOf(keyWord) != -1) {
					System.out.println(result);
				}
			} else {
				// 孩子节点不为空，继续迭代该孩子节点
				processNodeList(childList, keyWord);
			}
		}
	}

	// 测试的 main 方法
	public static void main(String[] args) {
		Set<String> links = HtmlParserTool.extracLinks("http://www.twt.edu.cn",
				new LinkFilter() {
					// 提取以 http://www.twt.edu.cn 开头的链接
					public boolean accept(String url) {
						if (url.startsWith("http://www.twt.edu.cn"))
							return true;
						else
							return false;
					}
				});
		for (String link : links)
			System.out.println(link);
	}
}
